home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1995…tember: Reference Library / Dev.CD Sep 95 RL / Dev.CD Sep 95 RL.toast / mac / Technical Documentation / develop / develop Issue 22 code / Futures / FutureShock / WindowHandler.cp < prev    next >
Encoding:
Text File  |  1995-04-14  |  11.7 KB  |  329 lines  |  [TEXT/MMCC]

  1. /*================================================================================
  2.     WindowHandler.cp
  3.     
  4.     ©1994 Greg Anderson
  5.     greggor@apple.com
  6.     
  7.     Classes and methods that handle window events
  8.         
  9. ================================================================================*/
  10. #include <AppleEvents.h>
  11. #include "WindowHandler.h"
  12. #include "MacUtilities.h"
  13. #include "DialogUtilities.h"
  14. #include "Exceptions.h"
  15.  
  16.  
  17. //----------------------------------------------------------------------------------------
  18. // GetWindowHandler: 
  19. //
  20. //    Return the window handler stored in the RefCon of this window, or fail if the
  21. //    RefCon of this window does not point to a window handler.
  22. //----------------------------------------------------------------------------------------
  23. TWindowHandler* GetWindowHandler(WindowPtr window)
  24. {
  25.     //
  26.     // Get the window handler from the refCon of the window
  27.     //
  28.     TWindowHandler* handler = nil;
  29.     if(window != nil)
  30.         handler = (TWindowHandler*)GetWRefCon(window);
  31.     
  32.     //
  33.     // If the handler is not valid, then fail
  34.     //
  35.     if((handler == nil) || (PtrValid((Ptr)handler) == false) || (handler->IsValidHandler() == false))
  36.         Throw(eNoWindowHandler);
  37.     
  38.     return handler;
  39. } // GetWindowHandler 
  40.  
  41. //----------------------------------------------------------------------------------------
  42. // TWindowHandler::~TWindowHandler: 
  43. //----------------------------------------------------------------------------------------
  44. TWindowHandler::~TWindowHandler()
  45. {
  46. } // TWindowHandler::~TWindowHandler 
  47.  
  48. //----------------------------------------------------------------------------------------
  49. // TWindowHandler::IWindowHandler: 
  50. //----------------------------------------------------------------------------------------
  51. void TWindowHandler::IWindowHandler(WindowPtr window)
  52. {
  53.     fWindow = window;
  54.     SetWRefCon(window, (long) this);
  55. } // TWindowHandler::IWindowHandler 
  56.  
  57. //----------------------------------------------------------------------------------------
  58. // TWindowHandler::Idle: 
  59. //----------------------------------------------------------------------------------------
  60. void TWindowHandler::Idle(EventRecord* event)
  61. {
  62. } // TWindowHandler::Idle 
  63.  
  64. //----------------------------------------------------------------------------------------
  65. // TWindowHandler::KeyDown: 
  66. //----------------------------------------------------------------------------------------
  67. Boolean TWindowHandler::KeyDown(EventRecord* event, char keyPressed)
  68. {
  69.     return false;
  70. } // TWindowHandler::KeyDown 
  71.  
  72. //----------------------------------------------------------------------------------------
  73. // TWindowHandler::Update: 
  74. //----------------------------------------------------------------------------------------
  75. void TWindowHandler::Update(EventRecord* event)
  76. {
  77. } // TWindowHandler::Update 
  78.  
  79. //----------------------------------------------------------------------------------------
  80. // TWindowHandler::Activate: 
  81. //----------------------------------------------------------------------------------------
  82. void TWindowHandler::Activate(EventRecord* event)
  83. {
  84. } // TWindowHandler::Activate 
  85.  
  86. //----------------------------------------------------------------------------------------
  87. // TWindowHandler::Deactivate: 
  88. //----------------------------------------------------------------------------------------
  89. void TWindowHandler::Deactivate(EventRecord* event)
  90. {
  91. } // TWindowHandler::Deactivate 
  92.  
  93. //----------------------------------------------------------------------------------------
  94. // TWindowHandler::Resume: 
  95. //----------------------------------------------------------------------------------------
  96. void TWindowHandler::Resume(EventRecord* event)
  97. {
  98.     this->Activate(event);
  99. } // TWindowHandler::Resume 
  100.  
  101. //----------------------------------------------------------------------------------------
  102. // TWindowHandler::Suspend: 
  103. //----------------------------------------------------------------------------------------
  104. void TWindowHandler::Suspend(EventRecord* event)
  105. {
  106.     this->Deactivate(event);
  107. } // TWindowHandler::Suspend 
  108.  
  109. //----------------------------------------------------------------------------------------
  110. // TWindowHandler::ContentClick: 
  111. //----------------------------------------------------------------------------------------
  112. Boolean TWindowHandler::ContentClick(EventRecord* event)
  113. {
  114.     return false;
  115. } // TWindowHandler::ContentClick 
  116.  
  117. //----------------------------------------------------------------------------------------
  118. // TWindowHandler::ResizeWindow: 
  119. //----------------------------------------------------------------------------------------
  120. void TWindowHandler::ResizeWindow(Point where)
  121. {
  122. } // TWindowHandler::ResizeWindow 
  123.  
  124. //----------------------------------------------------------------------------------------
  125. // TWindowHandler::CloseAndDelete: 
  126. //----------------------------------------------------------------------------------------
  127. void TWindowHandler::CloseAndDelete()
  128. {
  129.     delete this;
  130. } // TWindowHandler::CloseAndDelete 
  131.  
  132. //----------------------------------------------------------------------------------------
  133. // TWindowHandler::CloseWindowByUser: 
  134. //----------------------------------------------------------------------------------------
  135. void TWindowHandler::CloseWindowByUser()
  136. {
  137.     this->CloseAndDelete();
  138. } // TWindowHandler::CloseWindowByUser 
  139.  
  140. //----------------------------------------------------------------------------------------
  141. // TWindowHandler::SetupCursorShape: 
  142. //----------------------------------------------------------------------------------------
  143. Boolean TWindowHandler::SetupCursorShape(Point localMousePoint, RgnHandle localMouseRgn)
  144. {
  145.     return false;
  146. } // TWindowHandler::SetupCursorShape 
  147.  
  148. //----------------------------------------------------------------------------------------
  149. // TWindowHandler::SetupMenus: 
  150. //
  151. // The frontmost window is given a chance to change the way that menus are enabled
  152. // and disabled
  153. //----------------------------------------------------------------------------------------
  154. void TWindowHandler::SetupMenus()
  155. {
  156. } // TWindowHandler::SetupMenus
  157.  
  158. //----------------------------------------------------------------------------------------
  159. // TWindowHandler::ProcessMenuSelection: 
  160. //
  161. // The frontmost window is given a chance to process a menu command before it is
  162. // passed to the general menu handler
  163. //----------------------------------------------------------------------------------------
  164. Boolean TWindowHandler::ProcessMenuSelection(short commandID)
  165. {
  166.     return false;
  167. } // TWindowHandler::ProcessMenuSelection
  168.  
  169. //----------------------------------------------------------------------------------------
  170. // TWindowHandler::DialogManagerEvent: 
  171. //----------------------------------------------------------------------------------------
  172. void TWindowHandler::DialogManagerEvent(EventRecord* event, short itemHit)
  173. {
  174. } // TWindowHandler::DialogManagerEvent 
  175.  
  176.  
  177. //========================================================================================
  178. // CLASS TModelessDialogHandler
  179. //========================================================================================
  180.  
  181.  
  182. //----------------------------------------------------------------------------------------
  183. // TModelessDialogHandler::~TModelessDialogHandler: 
  184. //----------------------------------------------------------------------------------------
  185. TModelessDialogHandler::~TModelessDialogHandler()
  186. {
  187. } // TModelessDialogHandler::~TModelessDialogHandler 
  188.  
  189. //----------------------------------------------------------------------------------------
  190. // TModelessDialogHandler::IModelessDialogHandler: 
  191. //----------------------------------------------------------------------------------------
  192. void TModelessDialogHandler::IModelessDialogHandler(DialogPtr dialog, Boolean centerAndShow)
  193. {
  194.     TWindowHandler::IWindowHandler(dialog);    
  195.     
  196.     //
  197.     // Center and display the dialog as soon as it is initialized
  198.     //
  199.     if(centerAndShow)
  200.         CenterAndShowDialog(dialog);
  201. } // TModelessDialogHandler::IModelessDialogHandler 
  202.  
  203. //----------------------------------------------------------------------------------------
  204. // TModelessDialogHandler::KeyDown: 
  205. //----------------------------------------------------------------------------------------
  206. Boolean TModelessDialogHandler::KeyDown(EventRecord* event, char keyPressed)
  207. {
  208.     Boolean eventHandled = false;
  209.     short defaultButton = ((DialogPeek)this->DialogBoxPtr())->aDefItem;
  210.  
  211.     //
  212.     // Intercept Return if there is a default button
  213.     //    
  214.     if(((keyPressed == '\r') || (keyPressed == '\n')) && (DialogItemEnabled(this->DialogBoxPtr(), defaultButton)))
  215.     {
  216.         FlashDlogItem(this->DialogBoxPtr(), defaultButton);
  217.         // this->DialogManagerEvent(event, defaultButton);
  218.         eventHandled = true;
  219.     }
  220.     //
  221.     // We have to handle TAB ourselves, because the dialog manager
  222.     // refuses to skip disabled editText items
  223.     //
  224.     else if(keyPressed == '\t')
  225.     {
  226.         TabToNextEnabledTEItem(this->DialogBoxPtr());
  227.         eventHandled = true;
  228.     }
  229.     //
  230.     // If there are no enabled edit text items, then eat all keypresses
  231.     // (Note:  assumes that item #1 is not an editText item)
  232.     //
  233.     else if(EnabledTEItemsExist(this->DialogBoxPtr()) == false)
  234.     {
  235.         eventHandled = true;
  236.     }
  237.     
  238.     return eventHandled;
  239. } // TModelessDialogHandler::KeyDown 
  240.  
  241. //----------------------------------------------------------------------------------------
  242. // TModelessDialogHandler::ContentClick: 
  243. //
  244. // The dialog manager doesn't deal with deactive TextEdit items very well, so we're
  245. // going to intercept keypresses to inactive editText items here.
  246. //----------------------------------------------------------------------------------------
  247. Boolean TModelessDialogHandler::ContentClick(EventRecord* event)
  248. {
  249.     Rect tRect;
  250.     Handle itemHandle = nil;
  251.     short itemType;
  252.     Point localMousePoint = event->where;
  253.     Boolean eventHandled = false;
  254.     
  255.     //
  256.     // Make 'localMousePoint' really be local
  257.     //
  258.     GlobalToLocal(&localMousePoint);
  259.     
  260.     //
  261.     // Modeless dialog boxes may use FindDItem to find edit text items
  262.     // underneath the cursor
  263.     //
  264.     short itemNum = FindDItem(this->DialogBoxPtr(),localMousePoint) + 1;
  265.     if(itemNum > 0)
  266.     {
  267.         GetDItem(this->DialogBoxPtr(),itemNum,&itemType,&itemHandle,&tRect);
  268.         
  269.         //
  270.         // If the itemType has the 'disabled' bit set, don't pass through
  271.         // mouse clicks (one would think that the dialog manager would take
  272.         // care of this, but disabled editText items do get mouse clicks).
  273.         //
  274.         if(itemType & itemDisable)
  275.             eventHandled = true;
  276.     }
  277.  
  278.     return eventHandled;
  279. } // TModelessDialogHandler::ContentClick 
  280.  
  281. //----------------------------------------------------------------------------------------
  282. // TModelessDialogHandler::CloseAndDelete: 
  283. //----------------------------------------------------------------------------------------
  284. void TModelessDialogHandler::CloseAndDelete()
  285. {
  286.     DisposDialog(this->DialogBoxPtr());
  287.     delete this;
  288. } // TModelessDialogHandler::CloseAndDelete 
  289.  
  290. //----------------------------------------------------------------------------------------
  291. // TModelessDialogHandler::SetupCursorShape: 
  292. //
  293. //    Set the cursor to an I-beam if it passes over an editText item
  294. //----------------------------------------------------------------------------------------
  295. Boolean TModelessDialogHandler::SetupCursorShape(Point localMousePoint, RgnHandle localMouseRgn)
  296. {
  297.     Rect tRect;
  298.     Handle itemHandle = nil;
  299.     short itemType;
  300.     Boolean used = false;
  301.     
  302.     //
  303.     // Modeless dialog boxes may use FindDItem to find edit text items
  304.     // underneath the cursor
  305.     //
  306.     short itemNum = FindDItem(this->DialogBoxPtr(),localMousePoint) + 1;
  307.     if(itemNum > 0)
  308.     {
  309.         GetDItem(this->DialogBoxPtr(),itemNum,&itemType,&itemHandle,&tRect);
  310.         if(itemType == editText)
  311.             ChangeCursor(iBeamCursor);
  312.         else
  313.             ChangeCursor(0);
  314.         
  315.         //
  316.         // We don't need to recalculate the cursor shape as long as we are
  317.         // on top of this control
  318.         //
  319.         if(localMouseRgn != nil)
  320.             RectRgn(localMouseRgn, &tRect);
  321.         used = true;
  322.     }
  323.  
  324.     if(used == false)
  325.         used = TWindowHandler::SetupCursorShape(localMousePoint, localMouseRgn);
  326.     
  327.     return used;
  328. } // TModelessDialogHandler::SetupCursorShape 
  329.